import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * clase del heroe principal en donde se efectuan los metodos fly, shoot
 * y se obtienen los puntos y la salud del heroe
 * 
 * @author (Octavio y Cesar) 
 * @version (2014.11.28)
 */
public class Hero extends Actor
{

    private int points;
    private int speed; 
    private int health;
    private int lives;
    private Items item;
    private Timer time; 
    private int cambioArma;
    private Message m;
    

    /**
     * contructor de variables de la clase Hero
     */
    public Hero() 
    {

        points=0;
        speed=1;
        health=300;
        lives=3;
        item= new Items();
        time= new Timer();
        cambioArma=0;
        m=new Message(2);
        GreenfootImage image=getImage();
        image.scale(40,40);
        setImage(image);

    }
    
    /**
     * se ejecutan los metodos de fly, shoot y checacolicion y
     * se valida si toco algunos de los items para darle armas o vida al heroe
     * 
     */
    public void act() 
    {
        // Add your action code here. 
        this.fly();
        this.shoot();
        this.checaColicion();
        if(getWorld()!=null){
        if(isTouching(HeroLaser.class)) 
        {
            item=(Items)getOneIntersectingObject(HeroLaser.class);
            cambioArma=1;
            item.hide();
        }

        if(isTouching(HeroBomb.class))
        {
            item=(Items)getOneIntersectingObject(HeroBomb.class);
            cambioArma=2;
            item.hide();
        }

        if(isTouching(Health.class))
        {
            item=(Items)getOneIntersectingObject(Health.class);
            health=300;
            item.hide(); 
        }
       
    
         }

    }

    /**
     * metodo que mueve al heroe por todo el mundo validando que no se salga de los limites
     */
    public void fly()
    {

        if(Greenfoot.isKeyDown("up") && (getY()-40)>=0) 
            setLocation(getX(),getY()-10);
        if(Greenfoot.isKeyDown("down") && (getY()+40)<=getWorld().getHeight())
            setLocation(getX(),getY()+10);
        if(Greenfoot.isKeyDown("right") && (getX()+40)<=getWorld().getWidth()) 
            setLocation(getX()+10,getY()); 
        if(Greenfoot.isKeyDown("left") &&  (getX()-40)>=0) 
            setLocation(getX()-10,getY());

    }

    /**
     * metodo donde se realizan las validaciones de cambio de arma o el uso del arma por default
     */
    public void shoot()
    { 
        GreenfootSound bulletSound= new GreenfootSound("boom.wav");

        Guns bullet;
        GreenfootImage myImage=this.getImage();
        if(Greenfoot.isKeyDown("space"))
        {

            switch(cambioArma)
            {
                case 0:
                time.increases();
                if(time.getTime()==3)
                {                        
                    bullet= new Bullet();
                    getWorld().addObject(bullet,this.getX(),this.getY()-myImage.getHeight()/2);
                    bulletSound.setVolume(70);
                    bulletSound.play();
                    time.reset();
                }         

                break;

                case 1:
                time.increases();
                if(time.getTime()==3)
                {                      
                    bullet= new Laser();
                    getWorld().addObject(bullet,this.getX(),this.getY()-myImage.getHeight()/2);
                    bulletSound.setVolume(70);
                    bulletSound.play();
                    time.reset();
                }
                break;

                case 2:
                time.increases();
                if(time.getTime()==3)
                {                      
                    bullet= new Bomb();               
                    getWorld().addObject(bullet,this.getX(),this.getY()-myImage.getHeight()/2);
                    bulletSound.setVolume(70);
                    bulletSound.play();
                    time.reset();
                }
                break;
                default:

            }

        }
    }

    /**
     * metodo que3 modifica la salud del heroe
     * @param un numero entero que modifica la variable health
     */
    public void setHealth(int aHealth)
    {
        health=aHealth;
    }

    /**
     * metodo que modifica los puntos acumulados por el heroe
     * @param un numero entero para modificar o sumar los puntos del heroe
     */
    public void setPoints(int aPoints)
    {
        points+=aPoints; 
    }

    /**
     * @param un numero entero para modificar las vidas del heroe
     */
    public void setLives(int aLives)
    {
        lives=aLives;
    }

    /**
     * @return los puntos acumulados actuales del heroe
     */
    public int getPoints()
    {
        return points;
    }

    /**
     * @return la salud actual del heroe
     */
    public int getHealth()
    {
        return health;
    }

    /**
     *@return las vidas actuales del heroe 
     */
    public int getLives()
    {
        return lives;
    }

    /**
     * checa si el heroe choco con una nave enemiga, decrementa las vidas,
     * inicializa los puntos, inicializa el mundo y regresa al nivel 1
     */

    public void checaColicion()
    {

        if(isTouching(Enemy.class))
        {
            setImage("heroExplo02.png");
            (new GreenfootSound("exploStd.wav")).play();
            lives--;
            if(lives!=-1)
            points=0;
            cambioArma=0;
            /*
            if(lives<=0)
            Greenfoot.stop();
             */
            Greenfoot.delay(10);        
            ((Space)getWorld()).cleanWorld();
            setImage("hero.png");
            setLocation(getWorld().getWidth()/2,getWorld().getHeight()-40);
            GreenfootImage image=getImage();
            image.scale(40,40);
            setImage(image);
            setHealth(300);
            ((Space)getWorld()).appearsGhost(); 
            ((Space)getWorld()).setLevel(1); 
        }

        if(lives<0){
            ((Space)getWorld()).stopped();
            ((Space)getWorld()).updateRecord();

            ((Space)getWorld()).addObject(m,((Space)getWorld()).getWidth()/2,((Space)getWorld()).getHeight()/2);
            m.appearsMessage();
            Greenfoot.delay(60);
            getWorld().removeObject(this);
            World aux=getWorld();
            aux=new Menu();
            Greenfoot.setWorld(aux);
           
            //Greenfoot.stop();
        }
    }

    /**
     * checa si el heroe fue tocado por una bala de alguna nave enemiga, decrementa la salud,
     * si esta llega a cero inicializa los puntos, inicializa el mundo y regresa al nivel 1
     * @param el daño dependiendo la bala enemiga con que fue tocado
     */
    public void damageHero(int dam)
    {
        health-=dam;
        if(health<0)
        {
            lives--;
            if(lives!=-1)
            points=0;
            cambioArma=0;
            setImage("heroExplo02.png");
            (new GreenfootSound("exploStd.wav")).play();
            Greenfoot.delay(10);
            ((Space)getWorld()).cleanWorld();
            setImage("hero.png");
            setLocation(getWorld().getWidth()/2,getWorld().getHeight()-40);
            GreenfootImage image=getImage();
            image.scale(40,40);
            setImage(image);
            setHealth(300);
            ((Space)getWorld()).appearsGhost(); 
            ((Space)getWorld()).setLevel(1); 

        }
        if(lives<0)
        {
            ((Space)getWorld()).stopped();
            ((Space)getWorld()).updateRecord();
            
            ((Space)getWorld()).addObject(m,((Space)getWorld()).getWidth()/2,((Space)getWorld()).getHeight()/2);
            m.appearsMessage();
            Greenfoot.delay(60);
            getWorld().removeObject(this);
            
            World aux=getWorld();
            aux=new Menu();
            Greenfoot.setWorld(aux);
            
            //Greenfoot.stop();
        }
    }

}
